/**
 * Mock工具函数
 */

/**
 * 生成随机ID
 * @param {number} length ID长度
 * @returns {string} 随机ID
 */
export function generateId(length = 8) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  let result = ''
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

/**
 * 生成随机Token
 * @returns {string} 随机Token
 */
export function generateToken() {
  return 'mock_token_' + generateId(32)
}

/**
 * 格式化日期
 * @param {Date|string|number} date 日期
 * @param {string} format 格式
 * @returns {string} 格式化后的日期
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  const d = new Date(date)
  const year = d.getFullYear()
  const month = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hours = String(d.getHours()).padStart(2, '0')
  const minutes = String(d.getMinutes()).padStart(2, '0')
  const seconds = String(d.getSeconds()).padStart(2, '0')
  
  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds)
}

/**
 * 生成随机数字
 * @param {number} min 最小值
 * @param {number} max 最大值
 * @returns {number} 随机数字
 */
export function randomNumber(min = 0, max = 100) {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

/**
 * 生成随机浮点数
 * @param {number} min 最小值
 * @param {number} max 最大值
 * @param {number} decimals 小数位数
 * @returns {number} 随机浮点数
 */
export function randomFloat(min = 0, max = 100, decimals = 2) {
  const random = Math.random() * (max - min) + min
  return Number(random.toFixed(decimals))
}

/**
 * 从数组中随机选择元素
 * @param {Array} array 数组
 * @param {number} count 选择数量
 * @returns {any|Array} 随机元素或元素数组
 */
export function randomChoice(array, count = 1) {
  if (!Array.isArray(array) || array.length === 0) {
    return count === 1 ? null : []
  }
  
  if (count === 1) {
    return array[Math.floor(Math.random() * array.length)]
  }
  
  const shuffled = [...array].sort(() => 0.5 - Math.random())
  return shuffled.slice(0, Math.min(count, array.length))
}

/**
 * 生成随机布尔值
 * @param {number} probability 为true的概率（0-1）
 * @returns {boolean} 随机布尔值
 */
export function randomBoolean(probability = 0.5) {
  return Math.random() < probability
}

/**
 * 生成随机日期
 * @param {Date|string} start 开始日期
 * @param {Date|string} end 结束日期
 * @returns {Date} 随机日期
 */
export function randomDate(start = new Date(2024, 0, 1), end = new Date()) {
  const startTime = new Date(start).getTime()
  const endTime = new Date(end).getTime()
  const randomTime = startTime + Math.random() * (endTime - startTime)
  return new Date(randomTime)
}

/**
 * 生成随机字符串
 * @param {number} length 长度
 * @param {string} chars 字符集
 * @returns {string} 随机字符串
 */
export function randomString(length = 10, chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {
  let result = ''
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result
}

/**
 * 生成随机颜色
 * @param {string} format 格式 (hex, rgb, hsl)
 * @returns {string} 随机颜色
 */
export function randomColor(format = 'hex') {
  switch (format) {
    case 'hex':
      return '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0')
    case 'rgb':
      return `rgb(${randomNumber(0, 255)}, ${randomNumber(0, 255)}, ${randomNumber(0, 255)})`
    case 'hsl':
      return `hsl(${randomNumber(0, 360)}, ${randomNumber(0, 100)}%, ${randomNumber(0, 100)}%)`
    default:
      return randomColor('hex')
  }
}

/**
 * 生成分页数据
 * @param {Array} data 原始数据
 * @param {number} page 页码
 * @param {number} pageSize 每页大小
 * @returns {object} 分页结果
 */
export function paginate(data, page = 1, pageSize = 20) {
  const total = data.length
  const start = (page - 1) * pageSize
  const end = start + pageSize
  const list = data.slice(start, end)
  
  return {
    list,
    page,
    pageSize,
    total
  }
}

/**
 * 模拟延迟
 * @param {number} ms 延迟毫秒数
 * @returns {Promise} Promise对象
 */
export function delay(ms = 1000) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

/**
 * 生成随机名字
 * @returns {string} 随机名字
 */
export function randomName() {
  const firstNames = ['张', '李', '王', '刘', '陈', '杨', '赵', '黄', '周', '吴']
  const lastNames = ['伟', '芳', '娜', '敏', '静', '丽', '强', '磊', '军', '洋', '勇', '艳', '杰', '涛', '明', '超', '秀英', '霞', '平', '刚']
  
  return randomChoice(firstNames) + randomChoice(lastNames)
}

/**
 * 生成随机手机号
 * @returns {string} 随机手机号
 */
export function randomPhone() {
  const prefixes = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '150', '151', '152', '153', '155', '156', '157', '158', '159', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189']
  const prefix = randomChoice(prefixes)
  const suffix = randomString(8, '0123456789')
  return prefix + suffix
}

/**
 * 生成随机邮箱
 * @returns {string} 随机邮箱
 */
export function randomEmail() {
  const domains = ['gmail.com', 'qq.com', '163.com', '126.com', 'sina.com', 'hotmail.com']
  const username = randomString(randomNumber(5, 12), 'abcdefghijklmnopqrstuvwxyz0123456789')
  const domain = randomChoice(domains)
  return `${username}@${domain}`
}

/**
 * 生成随机地址
 * @returns {string} 随机地址
 */
export function randomAddress() {
  const provinces = ['北京市', '上海市', '广东省', '浙江省', '江苏省', '山东省', '河南省', '四川省', '湖北省', '湖南省']
  const cities = ['海淀区', '朝阳区', '西城区', '东城区', '丰台区', '石景山区', '门头沟区', '房山区', '通州区', '顺义区']
  const streets = ['中关村大街', '王府井大街', '长安街', '建国门外大街', '复兴门外大街', '西单北大街', '东单北大街', '前门大街', '崇文门外大街', '宣武门外大街']
  
  return randomChoice(provinces) + randomChoice(cities) + randomChoice(streets) + randomNumber(1, 999) + '号'
}

export default {
  generateId,
  generateToken,
  formatDate,
  randomNumber,
  randomFloat,
  randomChoice,
  randomBoolean,
  randomDate,
  randomString,
  randomColor,
  paginate,
  delay,
  randomName,
  randomPhone,
  randomEmail,
  randomAddress
}